<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>排列组合</title>
</head>
<body>
    

    <script>
            // 利用程序实现排列
            let arr = ['A','B','C','D'];
            function show(arr,num){
                let resultNum = 0;
                let resultArray = [];
                let iNow = 1;
                if(num == 1){
                    arr.push(arr.length)
                    return arr;
                }
                function change(arr,iNow,str){
                    for(let i = 0; i < arr.length; i++){
                        // arr.concat();  为了不产生引用关系 - 得到一个全新的数组
                        let result = arr.concat();
                        let strClone = str;

                        strClone += result.splice(i,1);

                        if(iNow == num){
                            resultNum += result.length;
                            // 得出第二次比较的值
                            for(let j = 0; j < result.length; j++){
                                resultArray.push(strClone + result[j]);
                            }

                        } else{
                            change(result,iNow+1,strClone);
                        }
                    }
                }
                change(arr,iNow+1,'');
                resultArray.push(resultNum);
                return resultArray;
            }
            console.log(show(arr,3));

            //得出利用数学方式实现排列有多少种
            function A(m,n){
                return f(m) / f(m-n);
            }

            function f(num){
                if(num <= 1){
                    return 1;
                }
                return num * f(num-1);
            }
            console.log(A(4,2));



            /**
             * 组合在原有程序基础上进行排序在进行去重
            */
            // 利用程序实现组合
            let arrs = ['A','B','C','D'];
            function shows(arr,num){
                let resultArray = [];
                let iNow = 1;
                if(num == 1){
                    arr.push(arr.length)
                    return arr;
                }
                function change(arr,iNow,str){
                    for(let i = 0; i < arr.length; i++){
                        // arr.concat();  为了不产生引用关系 - 得到一个全新的数组
                        let result = arr.concat();
                        let strClone = str;

                        strClone += result.splice(i,1);

                        if(iNow == num){
                            // 得出第二次比较的值
                            for(let j = 0; j < result.length; j++){
                                resultArray.push(strClone + result[j]);
                            }

                        } else{
                            change(result,iNow+1,strClone);
                        }
                    }
                }
                change(arr,iNow+1,'');

                // 排序 - 去重
                function uniqe(arr){
                    for(let i = 0; i < arr.length; i++){
                        arr[i] = arr[i].split('').sort().join('');
                    }

                    let result = [];
                    result = [...new Set(arr)];
                    return result;
                }

                resultArray = uniqe(resultArray);
                resultArray.push(resultArray.length);
                return resultArray;
            }
            console.log(shows(arr,3));

            //得出利用数学方式实现组合有多少种
            function C(m,n){
                return f(m) / (f(m-n) * f(n));
            }
            console.log(C(4,3));

    </script>
</body>
</html>